/***********************************************************************************
 * 文件名： swsd.c
 * 版本： 2
 * 说明：
 * 		SWSD(Switching signal detecter 开关信号检测器)，检测开关信号，提供触发（有效电平）
 *  、释放（无效电平）事件通知。其特点是触发事件尽可能的及时响应，可配置释放消抖,那么频繁的跳
 *  变将会认为一直处于触发状态。
 *      在配置文件中进行配置，针对POLSYS_LITE，需要间隔10ms调用 SWSD_Loop ，针对POLSYS，需
 *  要调用一次SWSD_Init()初始化本组件即可。在需要接收事件的地方定义 SWSD_Event(swsd_ev_t e)。
 *      如果启用了中断触发，需要配置好管脚中断，在中断函数中调用 SWSD_EvTrig。
 * 修改记录：
 * 	2021/05/06: 初版。 刘言。
 *  2021/07/01: 增加对POLSYS的支持。
***********************************************************************************/
#include "swsd.h"
#include "..\..\polsys.h"

bit _SWSD_mTriggered = false;
static u8 SWSD_mFreeTime;
#ifdef _SWSD_USE_SET_CB
static swsd_cb_t mCb;
#endif

#ifndef POLSYS_LITE
static polsys_task_t mTask;

static void Loop();
#endif

#ifdef _SWSD_USE_SET_CB
static void SWSD_Event(swsd_ev_t e);
#else
void SWSD_Event(swsd_ev_t e);
#endif


#ifdef _SWSD_USE_INT_TRIG
void SWSD_EvTrig()
{
    if(!_SWSD_mTriggered)
    {
        SWSD_Event(SWSD_EV_TRIG);
        _SWSD_mTriggered = true;
        SWSD_mFreeTime = 0;
        _SWSD_DisablePinInt();
    }
}
#endif

#ifndef POLSYS_LITE
// 初始化
void SWSD_Init()
{
    Polsys_TaskInit(&mTask, Loop, _SWSD_DETECT_INTERVAL);
}
#endif

#ifdef POLSYS_LITE
// 间隔10ms调用一次，用于释放消抖计时。
void SWSD_Loop()
#else
static void Loop()
#endif
{
    if(_SWSD_IsValid()) // 电平处于有效（触发）状态
    {
#ifndef _SWSD_USE_INT_TRIG
        if(!_SWSD_mTriggered)
        {
            _SWSD_mTriggered = true;
            SWSD_Event(SWSD_EV_TRIG);
        }
#endif
        SWSD_mFreeTime = 0;
    }
    else                // 电平处于无效（释放）状态
    {
        if(_SWSD_mTriggered)
        {
            SWSD_mFreeTime++;
            if(SWSD_mFreeTime == _SWSD_FREE_DELAY_TIME/_SWSD_DETECT_INTERVAL)
            {
                _SWSD_mTriggered = false;
                SWSD_Event(SWSD_EV_FREE);
#ifdef _SWSD_USE_INT_TRIG
                _SWSD_EnablePinInt();
#endif
            }
        }
    }
}


#ifdef _SWSD_USE_SET_CB
void SWSD_SetCb(swsd_cb_t cb)
{
    mCb = cb;
}

static void SWSD_Event(swsd_ev_t e)
{
    if(mCb)mCb(e);
}

#endif

